// ObjectDialog.cpp : implementation file
//

#include "stdafx.h"
#include "Test.h"
#include "ObjectDialog.h"
#include "RotateDlg.h"
#include "VectorDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CObjectDialog dialog


CObjectDialog::CObjectDialog(std::deque<VisualName> & v, Object3D * o, CWnd* pParent /*=NULL*/)
	: CDialog(CObjectDialog::IDD, pParent),object(o),visuals(v)
{
	//{{AFX_DATA_INIT(CObjectDialog)
	m_alpha = 1.0f;
	m_azul = 0.0f;
	m_rojo = 0.0f;
	m_verde = 0.0f;
	m_brillo = 1.0f;
	m_difusaAlpha = 1.0f;
	m_difusaAzul = 0.0f;
	m_difusaRojo = 0.0f;
	m_difusaVerde = 0.0f;
	m_matriz43 = 0.0f;
	m_matriz44 = 0.0f;
	m_especularAlpha = 1.0f;
	m_especularAzul = 0.0f;
	m_especularRojo = 0.0f;
	m_especularVerde = 0.0f;
	m_matriz11 = 0.0f;
	m_matriz12 = 0.0f;
	m_matriz13 = 0.0f;
	m_matriz14 = 0.0f;
	m_matriz21 = 0.0f;
	m_matriz22 = 0.0f;
	m_matriz23 = 0.0f;
	m_matriz24 = 0.0f;
	m_matriz31 = 0.0f;
	m_matriz32 = 0.0f;
	m_matriz33 = 0.0f;
	m_matriz34 = 0.0f;
	m_matriz42 = 0.0f;
	m_matriz41 = 0.0f;
	//}}AFX_DATA_INIT
}


void CObjectDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CObjectDialog)
	DDX_Text(pDX, IDC_AMBIENTE_ALPHA, m_alpha);
	DDV_MinMaxFloat(pDX, m_alpha, 0.f, 1.f);
	DDX_Text(pDX, IDC_AMBIENTE_AZUL, m_azul);
	DDV_MinMaxFloat(pDX, m_azul, 0.f, 1.f);
	DDX_Text(pDX, IDC_AMBIENTE_ROJO, m_rojo);
	DDV_MinMaxFloat(pDX, m_rojo, 0.f, 1.f);
	DDX_Text(pDX, IDC_AMBIENTE_VERDE, m_verde);
	DDV_MinMaxFloat(pDX, m_verde, 0.f, 1.f);
	DDX_Text(pDX, IDC_BRILLO, m_brillo);
	DDV_MinMaxFloat(pDX, m_brillo, 0.f, 1000.f);
	DDX_Text(pDX, IDC_DIFUSA_ALPHA, m_difusaAlpha);
	DDV_MinMaxFloat(pDX, m_difusaAlpha, 0.f, 1.f);
	DDX_Text(pDX, IDC_DIFUSA_AZUL, m_difusaAzul);
	DDV_MinMaxFloat(pDX, m_difusaAzul, 0.f, 1.f);
	DDX_Text(pDX, IDC_DIFUSA_ROJO, m_difusaRojo);
	DDV_MinMaxFloat(pDX, m_difusaRojo, 0.f, 1.f);
	DDX_Text(pDX, IDC_DIFUSA_VERDE, m_difusaVerde);
	DDV_MinMaxFloat(pDX, m_difusaVerde, 0.f, 1.f);
	DDX_Text(pDX, IDC_MATRIZ43, m_matriz43);
	DDX_Text(pDX, IDC_MATRIZ44, m_matriz44);
	DDX_Text(pDX, IDC_ESPECULAR_ALPHA, m_especularAlpha);
	DDV_MinMaxFloat(pDX, m_especularAlpha, 0.f, 1.f);
	DDX_Text(pDX, IDC_ESPECULAR_AZUL, m_especularAzul);
	DDV_MinMaxFloat(pDX, m_especularAzul, 0.f, 1.f);
	DDX_Text(pDX, IDC_ESPECULAR_ROJO, m_especularRojo);
	DDV_MinMaxFloat(pDX, m_especularRojo, 0.f, 1.f);
	DDX_Text(pDX, IDC_ESPECULAR_VERDE, m_especularVerde);
	DDV_MinMaxFloat(pDX, m_especularVerde, 0.f, 1.f);
	DDX_Text(pDX, IDC_MATRIZ11, m_matriz11);
	DDX_Text(pDX, IDC_MATRIZ12, m_matriz12);
	DDX_Text(pDX, IDC_MATRIZ13, m_matriz13);
	DDX_Text(pDX, IDC_MATRIZ14, m_matriz14);
	DDX_Text(pDX, IDC_MATRIZ21, m_matriz21);
	DDX_Text(pDX, IDC_MATRIZ22, m_matriz22);
	DDX_Text(pDX, IDC_MATRIZ23, m_matriz23);
	DDX_Text(pDX, IDC_MATRIZ24, m_matriz24);
	DDX_Text(pDX, IDC_MATRIZ31, m_matriz31);
	DDX_Text(pDX, IDC_MATRIZ32, m_matriz32);
	DDX_Text(pDX, IDC_MATRIZ33, m_matriz33);
	DDX_Text(pDX, IDC_MATRIZ34, m_matriz34);
	DDX_Text(pDX, IDC_MATRIZ42, m_matriz42);
	DDX_Text(pDX, IDC_MATRIZ41, m_matriz41);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CObjectDialog, CDialog)
	//{{AFX_MSG_MAP(CObjectDialog)
	ON_BN_CLICKED(IDC_SELECT_VISUAL, OnSelectVisual)
	ON_BN_CLICKED(IDC_DESELECT_VISUAL, OnDeselectVisual)
	ON_BN_CLICKED(IDCANCEL2, OnRotate)
	ON_BN_CLICKED(IDCANCEL3, OnTranslate)
	ON_BN_CLICKED(IDCANCEL4, OnScale)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CObjectDialog message handlers

BOOL CObjectDialog::OnInitDialog() 
{
	CDialog::OnInitDialog();
	char numero[10];
	int sel;
	CListBox * list=(CListBox *)GetDlgItem(IDC_VISUALES);
	
	for(int i=0;i<visuals.size();i++){
		//itoa(visuals[i]->ID,numero,10);
		list->AddString(CString("Visual ")+visuals[i].name/*CString(numero)*/);
		if(object->getVisual()==visuals[i].visual)
			sel=i;
	}
	list->SetCurSel(sel);
	Material mat=object->getMaterial();

	m_alpha=mat.ambient.a;
	m_azul=mat.ambient.b;
	m_rojo=mat.ambient.r;
	m_verde=mat.ambient.g;
	m_brillo=mat.shininess;
	m_difusaAlpha=mat.diffuse.a;
	m_difusaAzul=mat.diffuse.b;
	m_difusaRojo=mat.diffuse.r;
	m_difusaVerde=mat.diffuse.g;
	m_especularAlpha=mat.specular.a;
	m_especularAzul=mat.specular.b;
	m_especularRojo=mat.specular.r;
	m_especularVerde=mat.specular.g;
	updateMatrix();
	UpdateData(FALSE);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CObjectDialog::OnSelectVisual() 
{
	CListBox * list=(CListBox *)GetDlgItem(IDC_VISUALES);
	object->setVisual(visuals[list->GetCurSel()].visual);
}

void CObjectDialog::OnDeselectVisual() 
{
	object->setVisual(NULL);
	
}

void CObjectDialog::OnRotate() 
{
	CRotateDlg dlg;
	UpdateData();
	if(dlg.DoModal()==IDOK){
		object->rotate(Vector3D(dlg.m_x,dlg.m_y,dlg.m_z),dlg.m_angle);
		updateMatrix();
	}
	UpdateData(FALSE);
}

void CObjectDialog::OnTranslate() 
{
	CVectorDlg dlg;
	UpdateData();
	if(dlg.DoModal()==IDOK){
		object->translate(Vector3D(dlg.m_x,dlg.m_y,dlg.m_z));
		updateMatrix();
	}
	UpdateData(FALSE);
}

void CObjectDialog::OnScale() 
{
	CVectorDlg dlg;
	UpdateData();
	if(dlg.DoModal()==IDOK){
		object->scale(Vector3D(dlg.m_x,dlg.m_y,dlg.m_z));
		updateMatrix();
	}
	UpdateData(FALSE);
	
}

void CObjectDialog::updateMatrix()
{
	Matrix3D trans=object->getTransformation();
	m_matriz11=trans(0,0);
	m_matriz12=trans(0,1);
	m_matriz13=trans(0,2);
	m_matriz14=trans(0,3);
	m_matriz21=trans(1,0);
	m_matriz22=trans(1,1);
	m_matriz23=trans(1,2);
	m_matriz24=trans(1,3);
	m_matriz31=trans(2,0);
	m_matriz32=trans(2,1);
	m_matriz33=trans(2,2);
	m_matriz34=trans(2,3);
	m_matriz42=trans(3,1);
	m_matriz41=trans(3,0);
	m_matriz43=trans(3,2);
	m_matriz44=trans(3,3);
	
}

void CObjectDialog::OnOK() 
{
	Material mat;
	UpdateData();
	Matrix3D trans;

	trans(0,0)=m_matriz11;
	trans(0,1)=m_matriz12;
	trans(0,2)=m_matriz13;
	trans(0,3)=m_matriz14;
	trans(1,0)=m_matriz21;
	trans(1,1)=m_matriz22;
	trans(1,2)=m_matriz23;
	trans(1,3)=m_matriz24;
	trans(2,0)=m_matriz31;
	trans(2,1)=m_matriz32;
	trans(2,2)=m_matriz33;
	trans(2,3)=m_matriz34;
	trans(3,1)=m_matriz42;
	trans(3,0)=m_matriz41;
	trans(3,2)=m_matriz43;
	trans(3,3)=m_matriz44;

	object->setTransformation(trans);
	mat.ambient.a=m_alpha;
	mat.ambient.b=m_azul;
	mat.ambient.r=m_rojo;
	mat.ambient.g=m_verde;
	mat.shininess=m_brillo;
	mat.diffuse.a=m_difusaAlpha;
	mat.diffuse.b=m_difusaAzul;
	mat.diffuse.r=m_difusaRojo;
	mat.diffuse.g=m_difusaVerde;
	mat.specular.a=m_especularAlpha;
	mat.specular.b=m_especularAzul;
	mat.specular.r=m_especularRojo;
	mat.specular.g=m_especularVerde;
	object->setMaterial(mat);
	
	CDialog::OnOK();
}
